package main

import "fmt"

func add(a, b int) int {
  return a + b
}

func testFunc1() {
  f1 := add //←函数也是一种变量类型
  fmt.Printf("type of f1=%T\n", f1)

  sum := f1(2, 5)
  fmt.Printf("sum=%d\n", sum)
}

func testFunc2() {
  f1 := /*匿名函数→*/ func(a, b int) int {
    return a + b
  }

  fmt.Printf("type of f1=%T\n", f1)

  sum := f1(2, 5)
  fmt.Printf("sum=%d\n", sum)
}

func testFunc3(){
  var i int = 0
  defer fmt.Printf("i=%d\n",i) //0
  i = 100
  fmt.Printf("i=%d\n",i) //100
  return
}
func testFunc4(){
  var i int = 0
  defer func() {
    fmt.Printf("defer i=%d\n",i) //注意这样调用的话 包裹在一个匿名函数里的话 这里输出是 100 ---> 闭包
  }()
  i = 100
  fmt.Printf("i=%d\n",i) //100
  return
}

func main() {
  //testFunc1() //type of f1=func(int, int) int //sum=7

  //testFunc2()

  testFunc4()
/*
 i=100
 defer i=100
*/
}
